/*
 * =====================================================================================
 *       Filename:  find_cmd.c
 *    Description:  
 *        Version:  2.0
 *        Created:  2017.06.03 17:51
 *         Author:  fujiajun (fjj), fujiajun@renren1.com
 *        Company:  HOOLINKS
 * =====================================================================================
 */

#include "xshell.h"

void find_cmd(char* param[PARAMNUM]){
    char path[MAXPATHLEN];
    int length;

    // 对参数进行分析
    if(param[0] == NULL) {
        printf("find：缺少操作数\n");
    } else {
        if(param[1] == NULL) {
            printf("find：缺少操作数\n");
        } else {
            if (strcmp(param[1], "-name") != 0) {
                printf("find：命令格式错误\n");
                printf("find <目录> -name <待查找的文件名>\n");
            } else {
                if(param[2] == NULL){
                    printf("find：缺少操作数\n");
                } else {
                    // 获取要扫描的目标文件的绝对路径
                    getcwd(path, MAXPATHLEN);
                    length = strlen(path);
                    sprintf(path + length, "/%s", param[0]);
                    
                    // 执行操作
                    ergodic_folder(path, param[2]);
                }
            }
        }
    }
}

// path——当前绝对路径，folder——当前路径的文件夹，target——目标文件
void ergodic_folder(char* path, char* target){
    DIR* dir;
    struct dirent* file;
    int length;

    // 打开目录并获取所有目录及文件命
    dir = opendir(path);

    if (dir == NULL) {
        printf("%s 不是目录\n", path);
    } else {
        length = strlen(path);
        while((file = readdir(dir)) != NULL) {
            // 把当前目录.，上一级目录..及隐藏文件都去掉，避免死循环遍历目录
			if(strncmp(file->d_name, ".", 1) == 0){
				continue;
			}

            // 构造文件绝对路径
            sprintf(path + length, "/%s", file->d_name);

            // 判断是否为目标文件
            if(strcmp(file->d_name, target) == 0) {
                printf("%s\n", path);
            }

			//判断该文件是否是目录
			if(is_folder(path)) {
                ergodic_folder(path, target);
            }
		}
        
        closedir(dir);
    }
}